// file: GrilleMotsCroisesTest.cpp
#include "GrilleMotsCroisesTest.hpp"

CPPUNIT_TEST_SUITE_REGISTRATION (GrilleMotsCroisesTest);

void GrilleMotsCroisesTest :: setUp(void){
	// set up test environment (initializing objects)
	a = new GrilleMotsCroises();
	b = new GrilleMotsCroises(12,12,12);
	b->init(12,12,12);
	c = new GrilleMotsCroises(12,12,12);
	c->init(12,12,12);
	d = new GrilleMotsCroises(5,5,12);
	e = new GrilleMotsCroises(50,50,12);
	f = new GrilleMotsCroises(5,5,5);
	g = new GrilleMotsCroises(50,50,5);
	h = new GrilleMotsCroises(12,12,12);
	u = new GrilleMotsCroises(12,20,12);
	u->init(12,20,12);
	v = new GrilleMotsCroises(20,12,12);
	v->init(20,12,12);
}

void GrilleMotsCroisesTest :: tearDown(void){
	// finally delete objects
    delete a; 
    delete b;
    delete c;
    delete d;
    delete e;
    delete f;
    delete g;
    delete h;
    delete u;
    delete v;
}





void GrilleMotsCroisesTest :: chargerTest(void){
	CPPUNIT_ASSERT( a->charger()==1 ); // Cas usuel
	CPPUNIT_ASSERT( a->charger()==0 ); // Cas d'erreur : le fichier n'existe pas
}

void GrilleMotsCroisesTest :: estRemplieTest(void){
	c->defMots(12,12);
	
	CPPUNIT_ASSERT( c->estRemplie()==false );// Cas : grille vide
	
	c->remplirMot(1,"ABLACTATIONS");
	CPPUNIT_ASSERT(c->estRemplie()==false);// Cas usuel : grille ni vide ni remplie
	
	c->charger();
	CPPUNIT_ASSERT( c->estRemplie()==true );// Cas limite ?
}

void GrilleMotsCroisesTest :: estRemplieMotsTest(void){
	b->defMots(12,12);
	CPPUNIT_ASSERT( b->estRemplieMots()==false );// Cas limite : grille vide
	
	b->remplirMot(1,"ABLACTATIONS");
	CPPUNIT_ASSERT(b->estRemplieMots()==false);// Cas usuel : grille ni vide ni remplie
	
	b->charger();
	CPPUNIT_ASSERT( b->estRemplieMots()==true );// Cas limite : grille pleine de mots
}

void GrilleMotsCroisesTest :: initTest(void){
	CPPUNIT_ASSERT( d->init()==true );
	CPPUNIT_ASSERT( e->init()==true );
	CPPUNIT_ASSERT( f->init()==true );
	CPPUNIT_ASSERT( g->init()==true );
	CPPUNIT_ASSERT( h->init()==true );
}

void GrilleMotsCroisesTest :: ajouterCaseNoireTest(void){
	b->ajouterCaseNoire(0,0);
	CPPUNIT_ASSERT(b->getContenu(0,0)=='*');// Cas : bord du tableau
	b->ajouterCaseNoire(11,11);
	CPPUNIT_ASSERT(b->getContenu(11,11)=='*');// idem
	b->ajouterCaseNoire(11,11);
	CPPUNIT_ASSERT(b->getContenu(11,11)=='*');// On tente de remettre une case noire une une case deja noire
}

void GrilleMotsCroisesTest :: verifieContraintesTest(void){
	b->ajouterCaseNoire(1,1);
	CPPUNIT_ASSERT(b->verifieContraintes(0,1)==false);// Cas : case voisine d'une case noire
	CPPUNIT_ASSERT(b->verifieContraintes(1,0)==false);// Cas : case voisine d'une case noire
	CPPUNIT_ASSERT(b->verifieContraintes(1,2)==false);// Cas : case voisine d'une case noire
	CPPUNIT_ASSERT(b->verifieContraintes(2,1)==false);// Cas : case voisine d'une case noire
	CPPUNIT_ASSERT(b->verifieContraintes(1,1)==false);// Cas : case noire
	CPPUNIT_ASSERT(b->verifieContraintes(2,2)==true);// Cas usuel : case vide isolee
	CPPUNIT_ASSERT(b->verifieContraintes(0,0)==true);// Bord du tableau
	CPPUNIT_ASSERT(b->verifieContraintes(11,11)==true);// Bord du tableau
	b->ajouterCaseNoire(11,11);
	CPPUNIT_ASSERT(b->verifieContraintes(10,11)==false);// On verifie que ça marche au bord du tableau
	CPPUNIT_ASSERT(b->verifieContraintes(11,10)==false);
	b->ajouterCaseNoire(0,0);
	b->ajouterCaseNoire(2,0);
	CPPUNIT_ASSERT(b->verifieContraintes(1,0)==false);// On verifie qu'on ne cree pas de case isolee au bord du tableau
	
	b->ajouterCaseNoire(2,2);
	b->ajouterCaseNoire(3,1);
	CPPUNIT_ASSERT(b->verifieContraintes(2,1)==false);// On verifie qu'on ne cree pas de case isolee dans le tableau
}

void GrilleMotsCroisesTest :: defMotsTest(void){
	int i,j;
	b->defMots(12,12);
	CPPUNIT_ASSERT(b->getNbMotsH()==12 && b->getNbMotsV()==12);// Cas : grille vide
	
	b->ajouterCaseNoire(5,5);
	b->defMots(12,12);
	CPPUNIT_ASSERT(b->getNbMotsH()==13 && b->getNbMotsV()==13);// Cas usuel
	
	for(i=0;i<12;i++){
		for(j=0;j<12;j++){
			b->ajouterCaseNoire(i,j);
		}
	}
	b->defMots(12,12);
	CPPUNIT_ASSERT(b->getNbMotsH()==0 && b->getNbMotsV()==0);// Cas : grille remplie de cases noires
}

void GrilleMotsCroisesTest :: initCasesNoiresTest(void){
	int count,i;
	b->initCasesNoires(12,12);
	u->initCasesNoires(12,20);
	v->initCasesNoires(20,12);
	
	// b
	count=0;
	for(i=0;i<12;i++){
		if(b->getContenu(0,i)=='*') count++;
	}
	CPPUNIT_ASSERT(count==0);// On regarde s'il n'y a aucune case noire sur la premiere ligne	
	count=0;
	for(i=0;i<12;i++){
		if(b->getContenu(i,0)=='*') count++;
	}
	CPPUNIT_ASSERT(count==0);// On regarde s'il n'y a aucune case noire sur la premiere colonne
	
	//u
	count=0;
	for(i=0;i<12;i++){
		if(u->getContenu(0,i)=='*') count++;
	}
	CPPUNIT_ASSERT(count==0);// On regarde s'il n'y a aucune case noire sur la premiere ligne	
	
	//v
	count=0;
	for(i=0;i<12;i++){
		if(v->getContenu(i,0)=='*') count++;
	}
	CPPUNIT_ASSERT(count==0);// On regarde s'il n'y a aucune case noire sur la premiere colonne
}
